Este informe se enmarca en un proyecto de portafolio personal para la práctica de análisis e interpretación de datos usando RStudio. En este caso, se presenta un análisis exploratorio de la base de datos Gapminder, que contiene variables socio-económicas para 142 países. El ejercicio propuesto para la práctica de RStudio, consistió en solicitarle a modelos de IA (ChatGPT y Google Gemini) que me asignaran ejercicios de análisis y exploración de datos en aras de prácticar mis habilidades y proceso de aprendizaje en RStudio, es decir, sin especificar el código a ejecutar para completar las tareas propuestas. Además de esto, mediante estos mismos modelos de IA solicité retroalimentación técnica (respecto a la ejecución de las funciones y los operadores) y conceptual-interpretativa.
knitr::opts_chunk$set(echo = TRUE)
library(dplyr)
##
## Attaching package: 'dplyr'
## The following objects are masked from 'package:stats':
##
## filter, lag
## The following objects are masked from 'package:base':
##
## intersect, setdiff, setequal, union
library(ggplot2)
library(tidyr)
library(janitor)
##
## Attaching package: 'janitor'
## The following objects are masked from 'package:stats':
##
## chisq.test, fisher.test
library(forcats)
library(tidyverse)
## ── Attaching core tidyverse packages ──────────────────────── tidyverse 2.0.0 ──
## ✔ lubridate 1.9.4 ✔ stringr 1.5.1
## ✔ purrr 1.0.4 ✔ tibble 3.3.0
## ✔ readr 2.1.5
## ── Conflicts ────────────────────────────────────────── tidyverse_conflicts() ──
## ✖ dplyr::filter() masks stats::filter()
## ✖ dplyr::lag() masks stats::lag()
## ℹ Use the conflicted package (<http://conflicted.r-lib.org/>) to force all conflicts to become errors
library(readxl)
library(knitr)
library(gganimate)
library(gifski)
library(gapminder)
data(gapminder)
gapminder%>%
head(10)
## # A tibble: 10 × 6
## country continent year lifeExp pop gdpPercap
## <fct> <fct> <int> <dbl> <int> <dbl>
## 1 Afghanistan Asia 1952 28.8 8425333 779.
## 2 Afghanistan Asia 1957 30.3 9240934 821.
## 3 Afghanistan Asia 1962 32.0 10267083 853.
## 4 Afghanistan Asia 1967 34.0 11537966 836.
## 5 Afghanistan Asia 1972 36.1 13079460 740.
## 6 Afghanistan Asia 1977 38.4 14880372 786.
## 7 Afghanistan Asia 1982 39.9 12881816 978.
## 8 Afghanistan Asia 1987 40.8 13867957 852.
## 9 Afghanistan Asia 1992 41.7 16317921 649.
## 10 Afghanistan Asia 1997 41.8 22227415 635.
Hay 12 observaciones por cada país de la base de datos.
# podríamos hacer un conteo para mirar qupé países tienen sólo una observación
gapminder%>%
group_by(country)%>%
count()
## # A tibble: 142 × 2
## # Groups: country [142]
## country n
## <fct> <int>
## 1 Afghanistan 12
## 2 Albania 12
## 3 Algeria 12
## 4 Angola 12
## 5 Argentina 12
## 6 Australia 12
## 7 Austria 12
## 8 Bahrain 12
## 9 Bangladesh 12
## 10 Belgium 12
## # ℹ 132 more rows
El modelo de IA al que asigné la revisión de este ejercicio de análisis sugiere que, para precisar más el ejercicio, la función correcta es n_distinct(). Así:
n_distinct(gapminder$country)
## [1] 142
Este resultado es evidentemente más preciso que el anterior.
gapminder%>%
group_by(continent)%>%
summarise(life_expc_mean=round(mean(lifeExp,na.rm=T),1))%>%
arrange(desc(life_expc_mean))%>%
kable(col.names = c("Continent","Life expectation (mean)"))
| Continent | Life expectation (mean) |
|---|---|
| Oceania | 74.3 |
| Europe | 71.9 |
| Americas | 64.7 |
| Asia | 60.1 |
| Africa | 48.9 |
Evolución de la expectativa de vida en Colombia desde 1952 hasta 2007.
gapminder%>%
filter(country=="Colombia",
year>=1952&year<=2007)%>%
group_by(year,lifeExp)%>%
ggplot(aes(x=year,
y=lifeExp))+
geom_line()+
labs(title = "Life expectation in Colombia (1952-2007)",
x="Year",
y="Life expectation")+
theme_classic()+
geom_point()+
geom_text(aes(label = round(lifeExp,1)),vjust=-1.5)
gapminder2007<-gapminder%>%
filter(year==2007)
model_lifeexpc_gdppc<-lm(lifeExp~gdpPercap,data=gapminder2007)
summary(model_lifeexpc_gdppc)
##
## Call:
## lm(formula = lifeExp ~ gdpPercap, data = gapminder2007)
##
## Residuals:
## Min 1Q Median 3Q Max
## -22.828 -6.316 1.922 6.898 13.128
##
## Coefficients:
## Estimate Std. Error t value Pr(>|t|)
## (Intercept) 5.957e+01 1.010e+00 58.95 <2e-16 ***
## gdpPercap 6.371e-04 5.827e-05 10.93 <2e-16 ***
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
##
## Residual standard error: 8.899 on 140 degrees of freedom
## Multiple R-squared: 0.4606, Adjusted R-squared: 0.4567
## F-statistic: 119.5 on 1 and 140 DF, p-value: < 2.2e-16
El intercepto del modelo es de 5.957e+01, lo que representa que la expectativa de edad estimada en un país cuando el PIB per cápita es 0 o inexistente. Esto, pese a que no tiene sun sentido realista, es el punto de referencia para la operación. El coeficiente de regresión asociado al PIB per cápita es de 6.371e-04, lo cual expresa que por cada dólar adicional en el PIB per cápita, la expectativa de vida sube, en promedio, un 6.371e-04. Este resultado es estadísticamente significativo (p<0.005).
gapminder2007%>%
ggplot(aes(x=gdpPercap,
y=lifeExp))+
geom_point(alpha=.6)+
geom_smooth(method = "lm")+
theme_classic()+
labs(title = "Correlation between GDP per capita and life expectation (2007)",
x="GDP per capita",
y="Life expectation")
## `geom_smooth()` using formula = 'y ~ x'
#### Transforma el PIB per cápita usando logaritmo natural (log(gdpPercap)) y repite la regresión.
model_ln<-lm(lifeExp~log(gdpPercap),data=gapminder2007)
summary(model_ln)
##
## Call:
## lm(formula = lifeExp ~ log(gdpPercap), data = gapminder2007)
##
## Residuals:
## Min 1Q Median 3Q Max
## -25.947 -2.661 1.215 4.469 13.115
##
## Coefficients:
## Estimate Std. Error t value Pr(>|t|)
## (Intercept) 4.9496 3.8577 1.283 0.202
## log(gdpPercap) 7.2028 0.4423 16.283 <2e-16 ***
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
##
## Residual standard error: 7.122 on 140 degrees of freedom
## Multiple R-squared: 0.6544, Adjusted R-squared: 0.652
## F-statistic: 265.2 on 1 and 140 DF, p-value: < 2.2e-16
Ambos modelos correlacionan las mismas variables, sin embargo, como la varible del PIB posee una escala es tan grande, transformar esta mediante el función del logaritmo natural permite el entender el modelo de manera más clara, ya que esta nos arroja la expresión en términos proporcionales, lo cual reduce la escala. Así, en este modelo, el intercepto se encuentra 0.049496, lo cual sería la expectativa de vida asociada a un país cuando el PIB per cápita es 1 dólar (no 0 porque el logaritmo es indefinido y logaritmo natural de 1 es 0). Respecto al coeficiente de correlación, este expresa que en un incremento porcentual (de 1%) en el PIB per cápita tiene un efecto positivo de 0.07292 años más en la expectativa de vida de un país. Ahora, este modelo se ajusta mejor a los datos con base en el R^2, que para este es de 0.6544 y para el anterior fue de 0.4606.
gapminder2007%>%
ggplot(aes(x=log(gdpPercap),
y=lifeExp))+
geom_point(alpha=.6)+
geom_smooth(method = "lm")+
theme_classic()+
labs(title = "Correlation between GDP per capita and life expectation",
x="GDP per capita (LogNat)",
y="Life expectation")
## `geom_smooth()` using formula = 'y ~ x'
Se aprecia una relación más clara.
gapminder%>%
ggplot(aes(x=gdpPercap,
y=lifeExp,
color=continent))+
geom_point(alpha=.5,size=2)+
theme_classic()+
labs(title = "Time evolution: life expectation and GDP per capita",
x="GDP per capita",
y="Life expectation",
color="Continent",
subtitle = "Year: {frame_time}")+
transition_time(year)+
ease_aes('linear')
Este pertinente notar la distancia y el rezago que África presenta durante la década de 1990. Además de esto, se evidencia que, a diferencia del resto de continentes, África no presenta un crecimiento económico visual tan acelerado, tal como puede apreciarse con Europa, América y Ásia, mas sí incrementa su expectativa de vida. Lo anterior, podría dar paso a hipótesis más precisas que tomen en cuenta nuevos y diferentes factores que no sólo se limiten al PIB per cápita sino también avances médico-tecnológicos, políticas públicas de salud, mejoras infraestructurales, acceso a mejores recursos (como la calidad del agua potable), entre otros a considerar.
Tomaremos una muestra aleatoria: un país por cada continente
# muestra aleatoria # se debe desagrupar luego sacar la muestra
gapminder%>%
distinct(continent,country)%>%
group_by(continent)%>%
slice_sample(n=1)%>%
ungroup()
## # A tibble: 5 × 2
## continent country
## <fct> <fct>
## 1 Africa Somalia
## 2 Americas Uruguay
## 3 Asia China
## 4 Europe Hungary
## 5 Oceania New Zealand
countries_comp<-gapminder%>%
filter(country=="Somalia"|
country=="Jamaica"|
country=="Yemen, Rep."|
country=="Montenegro"|
country=="Australia")
Para poder comparar escalas con medidas tan diferentes como lo son la expectativa de vida y el PIB per cápita, procedemos a normalizar las varibales para poder conseguir una escala común. La fórmula para normalizar es x’=(x-min(x))/(max(x) - min(x)); esto es, valor normalizado (x’) es igual (=) a el valor original (x) menos el valor mínimo de la variable (min(x)) sobre (/) el valor máximo de la variable (max(x)) menos (-) el valor mínimo de la variable (min(x)).
Así, debemos crear los valores normalizados para las variables a comparar: expectativa de vida y PIB per cápita.
# creamos las nuevas variables con los valores normalizados
countries_comp<-countries_comp%>%
mutate(norm_lifeexpc=(lifeExp-min(lifeExp))/(max(lifeExp)-min(lifeExp)),
norm_gdppc=(gdpPercap-min(gdpPercap))/(max(gdpPercap)-min(gdpPercap)))
Procedemos a pivotear los datos, lo cual consiste, esencialmente, en transformar datos de un formato a otro. De formato ancho (wide format) a formato largo (long format) y viceversa. Este proceso se realiza para poder graficar dos variables o más en un mismo eje.
norm_countries_comp<-countries_comp%>%
pivot_longer(cols = c(norm_lifeexpc,norm_gdppc),names_to = "metric",values_to = "norm_value")
norm_countries_comp%>%
ggplot(aes(x=year,
y=norm_value,
color=country,
linetype=metric))+
geom_line(linewidth=1.1)+
theme_linedraw()+
theme_linedraw()+
labs(title="Compared evolution: life expectation and GDP per cápita in five countries (1952-2007)",
x="Year",
y="Normalized value",
color="Country",
linetype="Metric")
Véamos ahora lo mismo pero por páneles, según la pertenencia de cada país a su respectivo continente.
norm_countries_comp%>%
ggplot(aes(x=year,
y=norm_value,
color = country,
linetype = metric))+
geom_line(size=1.2)+
theme_linedraw()+
facet_wrap(~continent)+
labs(title="Compared evolution: life expectation and GDP per cápita in five countries (1952-2007)",
x="Year",
y="Normalized value",
color="Country",
linetype="Metric")
## Warning: Using `size` aesthetic for lines was deprecated in ggplot2 3.4.0.
## ℹ Please use `linewidth` instead.
## This warning is displayed once every 8 hours.
## Call `lifecycle::last_lifecycle_warnings()` to see where this warning was
## generated.